
import 'package:flutter/material.dart';

///如何获取Flutter应用维度生命周期
///WidgetsBindingObserver：是一个Widgets绑定观察器，通过它我们可以监听应用的生命周期、语言等的变化
class AppLifecycle extends StatefulWidget {
  @override
  _AppLifecycleState createState() => _AppLifecycleState();
}

class _AppLifecycleState extends State<AppLifecycle>
    with WidgetsBindingObserver {
  @override
  void initState() {
    WidgetsBinding.instance.addObserver(this);
    super.initState();
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Flutter应用生命周期'),
        leading: BackButton(),
      ),
      body: Container(
        child: Text('Flutter应用生命周期'),
      ),
    );
  }

  @override
  void didChangeAppLifecycleState(AppLifecycleState state) {
    super.didChangeAppLifecycleState(state);
    print('state = $state');
    if (state == AppLifecycleState.paused) {
      ///该应用程序当前对用户不可见，不响应用户输入，并且在后台运行。

      ///当应用程序处于此状态时，引擎将不会调用[Window.onBeginFrame]
      ///和[Window.onDrawFrame]回调。
      print('App进入后台');
    } else if (state == AppLifecycleState.resumed) {
      ///该应用程序可见，并响应用户输入。
      print('App进去前台');
    } else if (state == AppLifecycleState.inactive) {
      ///该应用程序处于非活动状态，未收到用户输入。

      ///在iOS上，此状态对应于以前台非活动状态运行的应用程序或Flutter主机视图。
      /// 在通话中，响应TouchID请求，进入应用程序切换器或控制中心或
      /// 托管UIViewController的UIViewController时，应用程序会转换到此状态。

      /// Flutter应用正在转换。

      ///在Android上，这对应于以前台非活动状态运行的应用程序或Flutter主机视图。
      /// 当关注其他活动时，例如拆分屏幕应用程序，电话，画中画应用程序，
      /// 系统对话框或其他窗口，应用程序会转换到此状态。

      ///处于此状态的应用程序应假定可以随时将其[暂停]。

      //不常用：应用程序处于非活动状态，并且未接收用户输入时调用，比如：来了个电话
    } else if (state == AppLifecycleState.detached) {
      ///该应用程序仍托管在Flutter引擎上，但与任何主机视图分离。
      ///当应用程序处于此状态时，引擎在运行时没有视图。 引擎首次初始化时，
      ///或者在由于导航器弹出而销毁视图之后，可能正在附加视图。
    }
  }

  @override
  void dispose() {
    WidgetsBinding.instance.removeObserver(this);
    super.dispose();
  }
}
